﻿/***********************************************
  [className] CPdfRptBase
  [func]      pdf报表业务基类
  [author]    WeiXiaoYu
  [date]      2025/01/08 16:00
  [log]       初次建立
[Modification Log]
Vers            By            Notes
************************************************/

#ifndef CPdfRptBase_H
#define CPdfRptBase_H

#include "HeaderFile.h"
#include "CPdfRptTool.h"

//其他AI检测算法类型
enum EPdfExteraAiType
{
	enConvBeltForeObjDet = 0,//传送带异物识别
	enConvBeltMassFlowDet,//传送带煤流量检测

	enUnknowAriType //未知算法类型
};

//Pdf输出的巡检项信息
class CPdfOutInspecItemInfoAll
{
public:
	EDevTypeCode eItemType;//巡检项类型

	double m_doMeasurementVal;//测量数值
	QString m_sState;//状态(正常/超上限)
	QString m_sRemark;//例如:上限32mg  其中\n代表换行 (改成显示阈值了-->上限:45℃)
	QString m_sUnit;//单位
	bool m_bStateOk;//是否正常(用于判断显示字体颜色)
	bool m_bIsAction;//是否执行
	QString m_sItemName;//巡检项名称

	QString m_sPictureAddress;//本地图片地址
	QString m_sHttpPicAddr;//http图片地址
	QString m_sPictureRemark;//图片备注

	CPdfOutInspecItemInfoAll()
	{
		m_doMeasurementVal = 0;
		m_sState = "";
		m_sRemark = "";
		m_sPictureAddress = "";
		m_sUnit = "";
		m_bStateOk = true;//默认正常
		m_sPictureRemark = "";
		m_bIsAction = false;
		m_sItemName = "";

	}
};

//表格中包含的巡检点信息
class CFormInspectionPointInfo
{
public:
	double m_douPointSortIndex;//排序号(不显示在表格里,用于给巡检点排序的)

	QString m_strInspectionPointName;//巡检点名称
	QString m_strRobotName;//机器人名称
	QString m_strLocation;//位置
	int m_nRollerCode;//托辊号(默认是0,是0就不显示在位置后面了)
	QString m_sRollerDesc;//托辊描述
	double  m_dLocation;//位置用于排序
	QString m_strInspectDate;//巡检日期 2023-11-13
	QString m_strInspectTime;//巡检时间 09:04:00
	QString m_strRemark;//备注(暂时为空，预留)

	QVector<CPdfOutInspecItemInfoAll> m_vecInspecItemsInfo;//巡检项信息(每个巡检点 可能勾选不同个数的巡检项 个数是不确定的)

	CFormInspectionPointInfo()
	{
		m_douPointSortIndex = 0;//排序号(不显示在表格里,用于给巡检点排序的)

		m_strInspectionPointName = "";//巡检点名称
		m_strRobotName = "";//机器人名称
		m_strLocation = "";//位置
		m_nRollerCode = 0;//托辊号(默认是0,是0就不显示在位置后面了)
		m_sRollerDesc = "";//托辊描述(上面的int型废弃了)
		m_strInspectDate = "";//巡检日期
		m_strInspectTime = "";//巡检时间
		m_strRemark = "";//备注
	}
};

//纠偏单个报警信息
class CPdfRecSglAlmInfo
{
public:
	QString m_sPictureUrl;//图片URL地址(现在改成了http图片地址)
	QString m_sBeltName;//皮带名称
	QString m_sRecPointName;//纠偏点名称
	QString m_sRecStartTime;//跑偏开始时间
	QString m_sRecEndTime;//跑偏结束时间
	int m_nAlmType;//报警等级(0:未报警 1:报警) PS:新增本字段，用于区分存储非报警信息

	CPdfRecSglAlmInfo()
	{
		m_sPictureUrl = "";
		m_sBeltName = "";
		m_sRecPointName = "";
		m_sRecStartTime = "";
		m_sRecEndTime = "";	

		m_nAlmType = 0;//默认不报警
	}
};

//撕裂单个报警信息
class CPdfTearSglAlmInfo
{
public:
	QString m_sPictureUrl;//图片URL地址(现在改成了http图片地址)
	QString m_sBeltName;//皮带名称
	QString m_sTearPointName;//撕裂点名称
	QString m_sTearStartTime;//撕裂开始时间
	QString m_sTearEndTime;//撕裂结束时间
	int m_nAlmType;//报警等级(0:未报警 1:报警) PS:新增本字段，用于区分存储非报警信息

	CPdfTearSglAlmInfo()
	{
		m_sPictureUrl = "";
		m_sBeltName = "";
		m_sTearPointName = "";
		m_sTearStartTime = "";
		m_sTearEndTime = "";

		m_nAlmType = 0;//默认不报警
	}
};

//Ai图片框选区域
class CPdfAiPicPolygonArea
{
public:
	bool bPolygonAlarm;          //框选区域是否报警
	double dPolygonScore;        //框选区域得分
	QPoint pPoint;               //报警区域坐标
	double dWidth;               //宽度
	double dHeight;              //高度

	CPdfAiPicPolygonArea()
	{
		bPolygonAlarm = false;
		dPolygonScore = 0;
		dWidth = 0;
		dHeight = 0;
	}
};

//其他AI检测单个报警信息
class CPdfExtraAiAlmInfo
{
public:
	QString m_sAlmTime;//报警时间
	QString m_sAlmDesc;//报警描述
	QString m_sHttpPictureUrl;//Http图片地址
	QVector<CPdfAiPicPolygonArea> vecPolygonArea;  //图片框选区域
	double m_dImageWid;//图片宽度
	double m_dImageHig;//图片高度

	CPdfExtraAiAlmInfo()
	{
		m_sAlmTime = "";
		m_sAlmDesc = "";
		m_sHttpPictureUrl = "";
		m_dImageWid = 1920;
		m_dImageHig = 1080;
	}
};

//声振温单个报警信息
class CPdfSeSeSglAlmInfo
{
public:
	QString m_sBeltName;//皮带名称
	QString m_sDevName;//设备名称
	int m_nChannelNo;//通道号
	QString sAlmTime;//报警时间(11:11:11)
	QString sAccDirect;//维度
	int nTempAlm;//温度诊断(0:正常 1:异常)
	int nVibrationAlm;//振动诊断(0:正常 1:异常)
	int nVoiceAlm;//声音诊断(0:正常 1:异常)
	double m_dTempVal;//温度值
	double m_dRms;//加速度
	QString m_sChannelName;//通道名称

	CPdfSeSeSglAlmInfo()
	{
		m_sBeltName = "";
		m_sDevName = "";
		m_nChannelNo = 0;
		sAlmTime = "";
		sAccDirect = "";
		nTempAlm = 0;
		nVibrationAlm = 0;
		nVoiceAlm = 0;
		m_dTempVal = 0;
		m_dRms = 0;
		m_sChannelName = "";
	}
};

//球机单个报警信息
class CPdfBaCamSglAlmInfo
{
public:
	QString m_sAlmTime;//报警时间
	QString m_sAlmDesc;//报警描述
	QString m_sLocPicPath;//本地图片路径

	QString m_sBaCamName;//球机名称
	QString m_sBaCamItemName;//球机检测项名称
	
	double m_dMaxTemp;//最高温度
	double m_dMinTemp;//最低温度
	double m_dAvgTemp;//平均温度
	double m_dDataThresholdH;//高报阈值

	int m_nAlmType;//报警等级(0:未报警 1:报警) PS:新增本字段，用于区分存储非报警信息

	CPdfBaCamSglAlmInfo()
	{
		

		m_sAlmTime = "";
		m_sAlmDesc = "";
		m_sLocPicPath = "";

		m_sBaCamName = "";
		m_sBaCamItemName = "";
		
		m_dMaxTemp = 0;
		m_dMinTemp = 0;
		m_dAvgTemp = 0;
		m_dDataThresholdH = 0;

		m_nAlmType = 0;//默认不报警
	}
};

//单个连续检测信息(可以是红外、声音、图像)
class CSingleCotDetInfo
{
public:
	EDevTypeCode eItemCode;//巡检项类型(红外、声音、图像)

	QString m_strAlmDesc;//报警描述 超上限等
	double m_dLocation;//位置(m)
	int m_nRollerCode;//托辊号
	QString m_sRollerDesc;//托辊描述
	QString m_sRemark;//备注(改成阈值填写 高限50℃)
	double m_doMeasurementVal;//测量数值
	QString m_sPictureAddress;//图片地址(本地)
	QString m_sHttpPicAddr;//http图片地址
	QString m_sPictureRemark;//图片备注
	int m_nAlmState;//报警状态 0:正常 1:高报 2:高高报 -1:低报 -2:低低报
	QDateTime m_dtActionTime;//add执行时间

	//后面计算赋值的数据
	int nBelongTier;//归属层级 0:去程 1:归程

	CSingleCotDetInfo()
	{
		eItemCode = EDevTypeCode::enIR;
		m_strAlmDesc = "";
		m_dLocation = 0;
		m_nRollerCode = 0;
		m_sRollerDesc = "";
		m_sRemark = "";
		m_doMeasurementVal = 0;
		m_sPictureAddress = "";
		m_sHttpPicAddr = "";
		m_sPictureRemark = "";
		m_nAlmState = 0;

		//后面计算赋值的数据
		nBelongTier = 0;
	}
};

//机器人报表数据信息
class CPdfRptRobDataInfo
{
public:
	QString m_sClientCompanyName;//客户电厂名称
	QString m_sTaskActionId;//子任务Id(用于更新数据库中的pdf存储地址)

	QString m_sOutputPdfFolder;//输出pdf文件夹(完整本地路径)
	QString m_sRobPdfPathUrl;//机器人pdf报表 URL路径
	
	QString m_sRobotName;//机器人名称
	QString m_sTaskName;//巡检任务名称
	QString m_sTaskTime;//巡检日期
	QString m_sComment;//备注
	QString m_sTaskStartTime;//任务开始时间
	QString m_sTaskEndTime;//任务结束时间
	QString m_sTaskStartElecVal;//任务开始电量
	QString m_sTaskEndElecVal;//任务结束电量
	QString m_sTaskState;//任务状态
	QString m_sPercentOfPass;//合格率
	QString m_sInspPointCount;//巡检点数量(7个)
	QString m_sInspItemCount;//巡检项数量(30项)
	QString m_sInspItemNorCnt;//巡检项正常数量(28项)
	QString m_sInspItemAbnorCnt;//巡检项异常数量(2项)
	int m_nInspItemAbnorCnt;//巡检项异常数量(实际个数,用于判断是否红色加粗显示)
	QVector<QString> m_vecAbnorBriefList;//异常项简要信息列表,有几项，增加几行

	QVector<CFormInspectionPointInfo> m_vecFormInspPointInfo;//表格所有巡检点信息Vec容器

	//连续托辊检测结果
	QVector<CSingleCotDetInfo> m_VecCotDetInfo;//连续检测数据集合

	CPdfRptRobDataInfo()
	{
		m_sClientCompanyName = "";//客户电厂名称
		m_sTaskActionId = "";//子任务Id

		m_sOutputPdfFolder = "";
		m_sRobPdfPathUrl = "";

		m_sRobotName = "";//机器人名称
		m_sTaskName = "";//巡检任务名称
		m_sTaskTime = "";//巡检日期 2023-11-10
		m_sComment = "";//备注
		m_sTaskStartTime = "";//任务开始时间
		m_sTaskEndTime = "";//任务结束时间
		m_sTaskStartElecVal = "";//任务开始电量
		m_sTaskEndElecVal = "";//任务结束电量
		m_sTaskState = "";//任务状态
		m_sPercentOfPass = "";//合格率
		m_sInspPointCount = "";//巡检点数量
		m_sInspItemCount = "";//巡检项数量
		m_sInspItemNorCnt = "";//巡检项正常数量
		m_sInspItemAbnorCnt = "";//巡检项异常数量
		m_nInspItemAbnorCnt = 0;//巡检项异常数量(实际个数,用于判断是否红色加粗显示)
	}
};

//纠偏报表数据信息
class CPdfRptRectifyDataInfo
{
public:
	QString m_sOutputPdfFolder;//输出pdf文件夹(完整本地路径)

	QString m_sBeltName;//皮带名称
	QString m_sDetTime;//检测日期 2024-05-13
	QString m_sDetStartTime;//检测开始时间 15:27:20
	QString m_sDetEndTime;//检测结束时间 16:30:45
	int m_nAlmCount;//报警项数(报警的实际数量，不包括非报警)
	QString m_sComment;//备注

	QVector<CPdfRecSglAlmInfo> m_vecFormRecAlmInfo;//纠偏报警信息容器(重新设定下包含非报警信息)

	CPdfRptRectifyDataInfo()
	{
		m_sOutputPdfFolder = "";

		m_sBeltName = "";
		m_sDetTime = "2025-01-01";
		m_sDetStartTime = "00:01:00";
		m_sDetEndTime = "00:35:00";
		m_nAlmCount = 0;
		m_sComment = "";

	}
};

//撕裂报表数据信息
class CPdfRptTearDataInfo
{
public:
	QString m_sOutputPdfFolder;//输出pdf文件夹(完整本地路径)

	QString m_sBeltName;//皮带名称
	QString m_sDetTime;//检测日期 2024-05-13
	QString m_sDetStartTime;//检测开始时间 15:27:20
	QString m_sDetEndTime;//检测结束时间 16:30:45

	int m_nAlmCount;//报警项数(报警的实际数量，不包括非报警)
	QString m_sComment;//备注

	QVector<CPdfTearSglAlmInfo> m_vecFormTearAlmInfo;//撕裂报警信息容器

	CPdfRptTearDataInfo()
	{
		m_sOutputPdfFolder = "";

		m_sBeltName = "";
		m_sDetTime = "2025-01-01";
		m_sDetStartTime = "00:01:00";
		m_sDetEndTime = "00:35:00";

		m_nAlmCount = 0;
		m_sComment = "";


	}
};

//其他AI检测报表数据信息
class CPdfRptExtraAiDataInfo
{
public:
	QString m_sOutputPdfFolder;//输出pdf文件夹(完整本地路径)

	QString m_sBeltName;//皮带名称
	QString m_sDetTime;//检测日期 2024-05-13
	int m_nAlmCount;//报警项数
	QString m_sComment;//备注
	QString m_sDetStartTime;//检测开始时间 15:27:20
	QString m_sDetEndTime;//检测结束时间 16:30:45
	QMap<int, QVector<CPdfExtraAiAlmInfo>> m_mapExtraAiInfo;//其他AI检测报警map int:类型(0:传送带异物识别 1:传送带煤流量检测)

	CPdfRptExtraAiDataInfo()
	{
		m_sOutputPdfFolder = "";

		m_sBeltName = "";
		m_sDetTime = "2025-01-01";
		m_nAlmCount = 0;
		m_sComment = "";
		m_sDetStartTime = "00:01:00";
		m_sDetEndTime = "00:35:00";
	}
};

//声振温报表数据信息
class CPdfRptSeSeDataInfo
{
public:
	QString m_sOutputPdfFolder;//输出pdf文件夹(完整本地路径)

	QString m_sBeltName;//皮带名称
	QString m_sDetTime;//检测日期 2024-05-13
	QString m_sDetStartTime;//检测开始时间 15:27:20
	QString m_sDetEndTime;//检测结束时间 16:30:45

	int m_nAlmCount;//报警项数
	QString m_sComment;//备注

	QVector<CPdfSeSeSglAlmInfo> m_vecFormSeSeAlmInfo;//声振温报警信息容器

	CPdfRptSeSeDataInfo()
	{
		m_sOutputPdfFolder = "";

		m_sBeltName = "";
		m_sDetTime = "2025-01-01";
		m_sDetStartTime = "00:01:00";
		m_sDetEndTime = "00:35:00";

		m_nAlmCount = 0;
		m_sComment = "";


	}
};

//球机报表数据信息
class CPdfRptBaCamDataInfo
{
public:
	QString m_sOutputPdfFolder;//输出pdf文件夹(完整本地路径)

	QString m_sBeltName;//皮带名称
	QString m_sDetTime;//检测日期 2024-05-13
	QString m_sDetStartTime;//检测开始时间 15:27:20
	QString m_sDetEndTime;//检测结束时间 16:30:45

	int m_nAlmCount;//报警项数
	QString m_sComment;//备注

	QVector<CPdfBaCamSglAlmInfo> m_vecFormBaCamAlmInfo;//球机报警信息容器

	CPdfRptBaCamDataInfo()
	{
		m_sOutputPdfFolder = "";

		m_sBeltName = "";
		m_sDetTime = "2025-01-01";
		m_sDetStartTime = "00:01:00";
		m_sDetEndTime = "00:35:00";

		m_nAlmCount = 0;
		m_sComment = "";
	}
};

//报表公共数据信息
class CPdfRptPubDataInfo
{
public:
	QString m_sOutputSynPdfFolder;//输出综合pdf文件夹路径(本地路径)
	QString m_sOutputSynPdfUrl;//输出综合pdf Url路径(网络路径)
	bool m_bSynIncRob;//综合报表包含机器人
	bool m_bSynIncRec;//综合报表包含纠偏
	bool m_bSynIncTear;//综合报表包含撕裂
	bool m_bSynIncRestAi;//综合报表包含其他AI检测
	bool m_bSynIncSese;//综合报表包含声振温
	bool m_bSynIncBaCam;//综合报表包含球机
	QString m_sSynBeltName;//综合检测皮带名称
	QString m_sSynDate;//综合检测日期(2025-02-25)
	QString m_sSynStartTime;//综合检测开始时间(10:15:00)
	QString m_sSynEndTime;//综合检测结束时间(12:30:10)
	
	CPdfRptPubDataInfo()
	{
		m_sOutputSynPdfFolder = "";
		m_sOutputSynPdfUrl = "";

		m_bSynIncRob = true;//机器人默认都有
		m_bSynIncRec = false;
		m_bSynIncTear = false;
		m_bSynIncRestAi = false;
		m_bSynIncSese = false;
		m_bSynIncBaCam = false;
		m_sSynBeltName = "";
		m_sSynDate = "";
		m_sSynStartTime = "";
		m_sSynEndTime = "";
	}
};


//所有pdf报表数据集合
class CAllPdfRptDataInfo
{
public:
	CPdfRptPubDataInfo pubDataInfo;//报表公共数据信息

	CPdfRptRobDataInfo robDataInfo;//机器人报表数据
	CPdfRptRectifyDataInfo rectifyDataInfo;//纠偏报表数据信息
	CPdfRptTearDataInfo tearDataInfo;//撕裂报表数据信息
	CPdfRptExtraAiDataInfo extraAiDataInfo;//其他AI检测报表数据信息
	CPdfRptSeSeDataInfo seseDataInfo;//声振温检测报表数据信息
	CPdfRptBaCamDataInfo bacamDataInfo;//球机检测报表数据信息

	CAllPdfRptDataInfo()
	{
		
	}
};


class QPainter;
class CTaskExecInfo;
class CDevDataBase;
class CPdfRptRobOperBase;
class CPdfRptRecOperBase;
class CPdfRptTearOperBase;
class CPdfRptRestAiOperBase;
class CpdfRptSeSeOperBase;
class CPdfRptBaCamOperBase;
class CPdfRptBase  : public QObject
{
	Q_OBJECT

public:
	CPdfRptBase(QObject *parent);
	virtual ~CPdfRptBase() = default;

public:
	CPdfRptRobOperBase *m_pPdfRptRobOperBase = nullptr;//声明pdf报表机器人操作基类指针(在子类中new,可以new基类,如有定制化,也可继承编写子类来new)
	
	CPdfRptRecOperBase *m_pPdfRptRecOperBase = nullptr;//声明pdf报表纠偏操作基类(在子类中new,可以new基类,如有定制化,也可继承编写子类来new)

	CPdfRptTearOperBase *m_pPdfRptTearOperBase = nullptr;//声明pdf报表撕裂操作基类(在子类中new,可以new基类,如有定制化,也可继承编写子类来new)

	CPdfRptRestAiOperBase *m_pPdfRptRestAiOperBase = nullptr;//声明其他AI检测操作基类(在子类中new,可以new基类,如有定制化,也可继承编写子类来new)

	CpdfRptSeSeOperBase *m_pPdfRptSeSeOperBase = nullptr;//声明声振温检测操作基类(在子类中new,可以new基类,如有定制化,也可继承编写子类来new)

	CPdfRptBaCamOperBase *m_pPdfRptBaCamOperBase = nullptr;//声明球机检测操作基类(在子类中new,可以new基类,如有定制化,也可继承编写子类来new)
	
	CPdfRptTool *m_pPdfRptTool = nullptr;//声明工具类指针 (在子类中new,并且传入操作类中)


public:
	// ======================定义纯虚函数,没有实现,子类需要实现(例如弘扬、南电定制化报表，需要新增子类继承重写纯虚函数，其他使用通用报表类继承重写纯虚函数)======================
	/***************************************************************
	* @brief     optRobPdfRptInfo函数功能:输出机器人pdf报表信息
	* @input     dataInfo|pdf报表数据
	* @output    sErrMsg|错误描述
	* @return    bool |成功返回true，失败返回false
	* @note      备注
	* @author    WeiXiaoYu
	* @time      2025-01-08 17:00
	* @Modification Log]
	 Vers            By            Notes
	**************************************************************/
	virtual bool optRobPdfRptInfo(CAllPdfRptDataInfo &dataInfo, QString &sErrMsg) = 0;//输出机器人pdf报表信息

	
	/***************************************************************
	* @brief     optSynthPdfRptInfo函数功能:输出综合pdf报表信息
	* @input     dataInfo|pdf报表数据
	* @output    sErrMsg|错误描述
	* @return    bool |成功返回true，失败返回false
	* @note      备注
	* @author    WeiXiaoYu
	* @time     2025-01-08 17:00
	* @Modification Log]
	 Vers            By            Notes
	**************************************************************/
	virtual bool optSynthPdfRptInfo(CAllPdfRptDataInfo &dataInfo, QString &sErrMsg) = 0;//输出综合pdf报表信息(机器人巡检、纠偏、撕裂、其他AI检测)

	
	/***************************************************************
	* @brief     optRectifyPdfRptInfo函数功能:输出纠偏pdf偏报表信息
	* @input     dataInfo|pdf报表数据
	* @output    sErrMsg|错误描述
	* @return    bool |成功返回true，失败返回false
	* @note      备注
	* @author    WeiXiaoYu
	* @time      2025-01-08 17:00
	* @Modification Log]
	 Vers            By            Notes
	**************************************************************/
	virtual bool optRectifyPdfRptInfo(CAllPdfRptDataInfo &dataInfo, QString &sErrMsg) = 0;//输出纠偏pdf报表信息

	
	/***************************************************************
	* @brief     optTearPdfRptInfo函数功能:输出撕裂pdf偏报表信息
	* @input     dataInfo|pdf报表数据
	* @output    sErrMsg|错误描述
	* @return    bool |成功返回true，失败返回false
	* @note      备注
	* @author    WeiXiaoYu
	* @time      2025-01-08 17:00
	* @Modification Log]
	 Vers            By            Notes
	**************************************************************/
	virtual bool optTearPdfRptInfo(CAllPdfRptDataInfo &dataInfo, QString &sErrMsg) = 0;//输出撕裂pdf偏报表信息

	/***************************************************************
	* @brief     optRestAiPdfRptInfo函数功能:输出其他AI检测报表信息
	* @input     dataInfo|pdf报表数据
	* @output    sErrMsg|错误描述
	* @return    bool |成功返回true，失败返回false
	* @note      备注
	* @author    WeiXiaoYu
	* @time      2025-01-08 17:00
	* @Modification Log]
	 Vers            By            Notes
	**************************************************************/
	virtual bool optRestAiPdfRptInfo(CAllPdfRptDataInfo &dataInfo, QString &sErrMsg) = 0;//输出其他AI检测报表信息


	//===============================================公共部分==========================================================
	/***************************************************************
	* @brief     函数功能:绘制报告名称
	* @input     sRptName|报告名称
	* @input     ePosition|绘制位置枚举
	* @input     painter|QPainter对象
	* @input     printer|QPrinter对象
	* @output    sErrMsg|错误描述
	* @return    bool |成功返回true，失败返回false
	* @note
	* @author    WeiXiaoYu
	* @time      2025-01-08 13:30
	* @Modification Log]
	 Vers            By            Notes
	**************************************************************/
	bool drawRptName(QString sRptName, EPdfRptComPosition ePosition, QPainter &painter, QPrinter &printer, QString &sErrMsg);


	/***************************************************************
	* @brief     函数功能:绘制综合报表综述表格
	* @input     dStartRow|绘制起始行
	* @input     dStartCol|绘制起始列
	* @input     dataInfo|报表数据集合
	* @input     painter|QPainter对象
	* @input     printer|QPrinter对象
	* @output    sErrMsg|错误描述
	* @return    bool |成功返回true，失败返回false
	* @note
	* @author    WeiXiaoYu
	* @time      2025-01-08 13:30
	* @Modification Log]
	 Vers            By            Notes
	**************************************************************/
	bool drawSynOverviewForm(double &dStartRow, double &dStartCol, CAllPdfRptDataInfo &dataInfo, QPainter &painter, QPrinter &printer, QString &sErrMsg);

	/***************************************************************
	* @brief     函数功能:绘制综合报表综述的异常列表
	* @input     dStartRow|绘制起始行
	* @input     dStartCol|绘制起始列
	* @input     vecAbnBriefInfo|异常简要信息列表
	* @input     painter|QPainter对象
	* @input     printer|QPrinter对象
	* @output    sErrMsg|错误描述
	* @return    bool |成功返回true，失败返回false
	* @note
	* @author    WeiXiaoYu
	* @time      2025-02-25 10:30
	* @Modification Log]
	 Vers            By            Notes
	**************************************************************/
	virtual bool drawOverviewAbnList(double &dStartRow, double &dStartCol, QVector<QString> vecAbnBriefInfo, QPainter &painter, QPrinter &printer, QString &sErrMsg);

	void getCotAppointMapData(QMap<int, QVector<CSingleCotDetInfo>> &mapCotAppoint, QVector<CSingleCotDetInfo> &vecCotDetInfo, EDevTypeCode eItemCode);//获取连续检测某类型指定Map数据
	
	void calculateCotRetBelongTier(QMap<int, QVector<CSingleCotDetInfo>> &mapCotIr, QMap<int, QVector<CSingleCotDetInfo>> &mapCotVoice, QMap<int, QVector<CSingleCotDetInfo>> &mapCotImage);//计算连续检测结果归属层级
};
#endif
